home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 235_02 / ovtty.c < prev    next >
Text File  |  1987-06-16  |  14KB  |  377 lines

  1. /*  045  26-Feb-87  ovtty.c
  2.  
  3.         Copyright (c) 1986 by Blue Sky Software.  All rights reserved.
  4. */
  5.  
  6. #include <dos.h>
  7. #include "ov.h"
  8.  
  9. #ifndef NULL
  10. #define NULL (0)
  11. #endif
  12.  
  13. static int vmode, vwidth, vpage;          /* initial video mode, width, page */
  14. static int crow, ccol, cstscan, cendscan; /* initial cursor stuff */
  15. static int save_row, save_col, save_stscan, save_endscan; /* save cursor */
  16.  
  17. char far *screen = NULL;               /* address of screen image */
  18. char far *cursor = NULL;               /* cursor location on screen */
  19. static char far *save_cursor;               /* loc to save cursor value */
  20. static int imageidx = 0;                    /* index of next image[] to use */
  21. static char far *image[2] = { NULL, NULL }; /* address of saved screen image */
  22. static char far *savcursor[2];              /* saved cursor location */
  23. char far *malloc_f();
  24.  
  25. unsigned char vid_attrib;              /* current video attribute to use */
  26. unsigned char vid_mode;                /* video mode in use */
  27. unsigned char attribs[7];              /* video attrib's in use */
  28.  
  29. /****************************************************************************
  30.  Following is a patch area used, updated by ovdef.c.  Do not change anything
  31.  in this area without also checking ovdef.c
  32.  ****************************************************************************/
  33.  
  34. char patchstr[] = "VIDEO HERE";        /* identify vid_snow in .EXE file */
  35. unsigned char vid_snow = 1;            /* NZ if must chk for video snow */
  36.  
  37. /* DIS_NORM, DIS_HIGH, DIS_BOX, DIS_HIBOX, DIS_HEAD, DIS_TEXT, DIS_TAGD */
  38.  
  39. unsigned char monattr[] = { 0x07, 0x70, 0x0F, 0x70, 0x70, 0x07, 0x0F };/*mono*/
  40. unsigned char cgaattr[] = { 0x0B, 0x30, 0x0E, 0x30, 0x1B, 0x0A, 0x0E };/* cga*/
  41.  
  42. /*****************************************************************************
  43.                             End of patch area
  44.  *****************************************************************************/
  45.  
  46.  
  47. /******************************************************************************
  48.  **                 I N I T  /  R E S E T _ T T Y                            **
  49.  *****************************************************************************/
  50.  
  51. init_tty() {           /* initialize the display (terminal?) */
  52.  
  53.    vmode = getvideomode(&vwidth,&vpage);   /* save current video state */
  54.  
  55.    /* initialize the display adapter, currently only modes 3 and 7
  56.       are supported.  Set the mode (which also clears the screen),
  57.       and if a CGA, make sure display page 0 is active */
  58.  
  59.    if (vmode < 7) {                            /* initialize a CGA */
  60.       setvideomode(vid_mode = 3);              /* color, 80x25 text */
  61.       setdisplaypage(0);                       /* display page 0 */
  62.       strncpy(attribs,cgaattr,sizeof(cgaattr));/* set up cga display attr's */
  63.  
  64.       FP_SEG(screen) = 0xB800;                 /* set screen base address */
  65.  
  66.    } else {                                    /* initialize a MONO adapter */
  67.       setvideomode(vid_mode = 7);              /* clears the screen */
  68.       strncpy(attribs,monattr,sizeof(monattr));/* set up mono display attr's */
  69.       vid_snow = 0;                            /* no snow on mono */
  70.       FP_SEG(screen) = 0xB000;                 /* set screen base address */
  71.    }
  72.  
  73.    setvattrib(DIS_NORM);          /* set default video attribute */
  74.    cursor = screen;               /* cursor is at top of screen */
  75.  
  76.    /* save data about the cursor position and size, we're going
  77.       to turn off the cursor and we want to be able to restore
  78.       it later */
  79.  
  80.    readcursor(vpage,&crow,&ccol,&cstscan,&cendscan);  /* save info */
  81.  
  82.    setcursorsize(32,0);           /* turn off hardware cursor */
  83. }
  84.  
  85. reinit_tty() {         /* reinitialize tty from unknown state */
  86.  
  87.    int mode, dummy;
  88.  
  89.    mode = getvideomode(&dummy,&dummy); /* get current video mode */
  90.    if (mode != vid_mode)               /* reset video mode if need be */
  91.       setvideomode(vid_mode);
  92.    if (vid_mode == 3)                  /* set display page 0 if cga */
  93.       setdisplaypage(0);
  94.    hidecursor();                       /* make sure cursor is off */
  95. }
  96.  
  97.  
  98. reset_tty() {         /* restore the display to pre-overview status */
  99.  
  100.    setvideomode(vmode);                   /* restore the video mode */
  101.  
  102.    setdisplaypage(vpage);                 /* restore display page */
  103.  
  104.    setcursorsize(cstscan,cendscan);       /* turn the curosr back on */
  105. }
  106.  
  107.  
  108. /******************************************************************************
  109.  **                      S E T V A T T R I B                                 **
  110.  *****************************************************************************/
  111.  
  112. int ALTCALL
  113. setvattrib(i)          /* set the video attribute */
  114. int i;
  115. {
  116.    vid_attrib = attribs[i];
  117. }
  118.  
  119.  
  120. /******************************************************************************
  121.  **                       D I S P _ S T R _ A T                              **
  122.  *****************************************************************************/
  123.  
  124. int ALTCALL
  125. disp_str_at(s,r,c)     /* display a string at specified row, column */
  126. char *s;
  127. int r,c;
  128. {
  129.    gotorc(r,c);        /* goto display location */
  130.    disp_str(s);        /* use our own routine */
  131. }
  132.  
  133.  
  134. /******************************************************************************
  135.  **                    D I S P _ C H A R _ A T                               **
  136.  *****************************************************************************/
  137.  
  138. int ALTCALL
  139. disp_char_at(ch,r,c)   /* display a char at specified row, column */
  140. int ch, r, c;
  141. {
  142.    gotorc(r,c);        /* goto display location */
  143.    disp_char(ch);      /* use our other routine to display it */
  144. }
  145.  
  146.  
  147. /******************************************************************************
  148.                          D I S P _ R E P _ A T
  149.  *****************************************************************************/
  150.  
  151. int ALTCALL
  152. disp_rep_at(ch,cnt,r,c)        /* display cnt ch's at specified row, column */
  153. int ch, cnt, r, c;
  154. {
  155.    gotorc(r,c);        /* goto display location */
  156.    disp_rep(ch,cnt);   /* use our other routine to display it */
  157. }
  158.  
  159.  
  160. /******************************************************************************
  161.  **                     P U T C H   /  P U T S T R                           **
  162.  *****************************************************************************/
  163.  
  164. putchr(ch) {                   /* these routines only exist because they */
  165.    putch(ch);                  /* update the hardware cursor position */
  166. }                              /* while doing output, a function that is */
  167.                                /* useful when doing direct screen i/o, but */
  168. putstr(s)                      /* some functions require the user to see */
  169. register char *s;              /* a cursor.  The simulated cursor could */
  170. {                              /* be made to handle this, but this is so */
  171.    while (*s)                  /* much easier and the usage of these */
  172.       putch(*s++);             /* functions is quite low */
  173. }
  174.  
  175. putstr_nomove(s)               /* here's a strange one, it displays a string */
  176. char *s;                       /*   without moving the hardware or software */
  177. {                              /*   cursor */
  178.    int row, col, x;
  179.    char far *savec;
  180.  
  181.    savec = cursor;                     /* save software cursor location */
  182.    readcursor(0,&row,&col,&x,&x);      /* get hardware cursor location */
  183.  
  184.    /* move software cursor to hardware location and display string */
  185.  
  186.    cursor = screen + (row * 160) + (col << 1);
  187.    disp_str(s);                               /* doesn't move hardware cursor */
  188.  
  189.    cursor = savec;             /* restore software cursor */
  190. }
  191.  
  192.  
  193. /******************************************************************************
  194.  **                          G E T C H R                                     **
  195.  *****************************************************************************/
  196.  
  197. getchr() {             /* get a character from the terminal */
  198.  
  199.    register int